解题思路
- 反转整个字符串
- 找到单个单词
- 反转单个单词
- 清除末尾空格
注意事项
反转字符串后,最开始有可能为空格,因此需要检测空格
找到单个单词并移动,使用idx表示新字符串存放位置
反转单词时位置关系,应使用idx表示,start和end不能准确表达
修改完单词后添加空格,这里应在单词前添加,防止清除不干净
代码
class Solution {
public:
string reverseWords(string s) {
// 反转整个字符串
reverse(s.begin(),s.end());
int n = s.size();
int idx = 0; // 记录修改的位置
for(int start = 0; start<n; ++start) {
// 找到不是空格的位置
if(s[start]!=' '){
// 在非第一个单词前补' '
if(idx!=0) s[idx++] = ' ';
int end = start; // 初始化end
// 找到不是空格的位置
while(end<n&&s[end]!=' ') {
s[idx++] = s[end++]; // 原字符串修改
}
// 反转单词 用idx标记,因为发生了字符串挪动
reverse(s.begin()+idx-(end-start),s.begin()+idx);
//reverse(s.begin()+start,s.begin()+end);
// 更新start
start = end;
}
}
// 清除最后的空格
s.erase(s.begin()+idx,s.end());
return s;
}
};